# -*- coding: utf-8 -*-
# @Time    : 2024/7/1 15:38
# @Author  : yujiahao
# @File    : 12_numpy_byte_swap.py
# @description:NumPy字节交换

"""
数据以字节的形式存储在计算机内存中，而存储规则可分为两类，即小端字节序与大端字节序。

小端字节序（little-endian），表示低位字节排放在内存的低地址端，高位字节排放在高地址段，
它与大端字节序（big-endian）恰好相反。

对于二进制数 0x12345678，假设从地址 0x4000 开始存放，在大端和小端模式下，它们的字节排列顺序如下所示：

内存地址增长方向
<----------------------
0x4003  0x4002  0x4001  0x4000
 0x12    0x34    0x56    0x78   小端

 0x78    0x56    0x34    0x12   大端
---------------------->

总结：
- 小端字节序：低位字节排放在内存的低地址端，高位字节排放在高地址端。
  例如，0x12345678 在小端模式下存储为 0x78563412。
- 大端字节序：高位字节排放在内存的低地址端，低位字节排放在高地址端。
  例如，0x12345678 在大端模式下存储为 0x12345678。
"""
import numpy as np

# numpy.ndarray.byteswap()
'''该函数将数组中每个元素的字节顺序进行大小端调换。

总结：
 - byteswap() 函数用于将数组中每个元素的字节顺序进行大小端调换。
 - 在调用 byteswap(True) 后，数组 a 的内容发生了变化，字节顺序被调换。
 - 通过 map(hex, a) 可以将数组中的每个元素转换为16进制表示，以便更直观地观察其内存中的存储形式。
'''

# 创建一个包含整数的 NumPy 数组，数据类型为 int16（16位整数）
a = np.array([1, 256, 8755], dtype=np.int16)

# 打印数组 a
print(a)  # 输出: [   1  256 8755]

# 以16进制形式表示内存中的数据
print('以16进制形式表示内存中的数据', list(map(hex, a)))
# 输出: 以16进制形式表示内存中的数据 ['0x1', '0x100', '0x2233']

# 调用 byteswap() 函数并传递 True 参数，这将就地转换字节顺序
print('以16进制形式表示内存中的数据', a.byteswap(True))
# 输出: 以16进制形式表示内存中的数据 [  256     1 13090]

# 以16进制形式显示转换后的数组
print('以16进制形式表示内存中的数据', list(map(hex, a)))
# 输出: 以16进制形式表示内存中的数据 ['0x100', '0x1', '0x3322']
